package com.qkjia.springselltest.exdemo;

import com.sun.xml.internal.bind.v2.schemagen.xmlschema.Documentation;
import org.springframework.shell.Availability;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.standard.ShellMethodAvailability;

import java.util.Calendar;

import static java.util.Calendar.DAY_OF_WEEK;

/**   动态命令有三种方式
 * 动态命令可用性
 * 由于应用程序的内部状态，有时注册的命令没有意义。 例如，可能有一个下载命令，但它只有在用户在远程服务器上使用连接后才能工作。
 * 现在，如果用户试图使用下载命令，shell应该优雅地解释该命令确实存在，但它当时不可用。 Spring Shell允许开发人员这样做，甚至提供了该命令不可用的简短解释。
 *
 * 命令显示可用性有三种可能的方式。 它们都利用了一个返回可用性实例的无参数方法。 让我们从一个简单的例子开始:
 */
@ShellComponent//同Component
public class MyCommands2 {  //用百度方法，  这个测试不明白

    private boolean connected;

/*    @ShellMethod("Connect to the server.")//连接到服务器
    public void connect(String user, String password) {
//
        connected = true;
    }

    @ShellMethod("Download the nuclear codes.")//下载核代码
    public void download() {
//       return "execute downloading ...";
    }

    public Availability downloadAvailability() {
        return connected
                ? Availability.available()
                : Availability.unavailable("you are not connected");//你没有连接
    }*/
/**
 * 这里您可以看到connect方法用于连接到服务器(细节略)，完成时通过connected boolean改变命令的状态。 在用户连接之前，下载命令将被标记为不可用，
 * 这是由于存在与下载命令方法名称完全相同且名称中带有Availability后缀的方法。 该方法返回一个可用性实例，该实例是由两个工厂方法之一构造的
 * 。 在命令不可用的情况下，必须提供解释。 现在，如果用户试图在未连接的情况下调用命令，会发生以下情况:
 *
 * shell:>download
 * Command 'download' exists but is not currently available because you are not connected.
 * Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
 *

 */

    //测试
    //    shell:>download
    //    Command 'download' exists but is not currently available because you are not connected
    //    Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.

    /**
     * * 有关当前不可用命令的信息也被利用在集成帮助中。请参阅与帮助命令的集成文档。
     * * 当命令不可用时提供的原因应该读得很好，如果附加后"因为..."
     * * 最好不要用大写字母开头，不要添加最后一个点。
     * * 如果出于某种原因，以命令方法的名称命名可用性方法不适合您，您可以使用类似：@ShellMethodAvailability
     */
  /*  @ShellMethod("Download the nuclear codes.")//方法注释  ，推荐已大写字母开头 ， 。结尾.
    @ShellMethodAvailability("availabilityCheck")//按名称匹配  同一类中的多个命令共享相同的内部状态，因此应全部可用或不可用。
    //当命令不可用时提供的原因应该读得很好，如果附加后"因为..."
    public void download2() {
    //       [...]
    }

    public Availability availabilityCheck() {//按名称匹配
        return connected
                ? Availability.available()
                : Availability.unavailable("you are not connected");

    }
*/
    /**
     * 最后，通常情况下，同一类中的多个命令共享相同的内部状态，因此应全部可用或不可用。
     * Spring Shell 无需坚持所有命令方法，而是允许用户翻转内容，并在可用性方法上放置注释，
     * 指定其控制的命令的名称：
     * @ShellMethodAvailability
     * @ShellMethodAvailabilty
     */


     @ShellMethod("Download the nuclear codes.")
   public void download() {
//       [...]
   }

   @ShellMethod("Disconnect from the server.")
   public void disconnect() {
//       [...]
   }

   @ShellMethodAvailability({"download", "disconnect"})
   public Availability availabilityCheck() {
       return connected
               ? Availability.available()
               : Availability.unavailable("you are not connected");

   }
   //测试   不知道对不对
/*    shell:>disconnect
    Command 'disconnect' exists but is not currently available because you are not connected
    Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
            shell:>download
    Command 'download' exists but is not currently available because you are not connected
    Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.*/



}


